/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.entity.Empreendimento;
import br.jm.financeiro.entity.EmpreendimentoLote;
import br.jm.financeiro.entity.Empresa;
import br.jm.financeiro.entity.ExportarExcel;
import br.jm.financeiro.entity.Proposta;
import br.jm.financeiro.entity.PropostaValor;
import br.jm.financeiro.entity.PropostaValorPerc;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.sistema.eao.EmpreendimentoLoteEao;
import br.jm.financeiro.sistema.eao.EmpresaEao;
import br.jm.financeiro.sistema.eao.ExportarEao;
import br.jm.financeiro.sistema.eao.PropostaEao;
import br.jm.financeiro.sistema.eao.PropostaValorPercEao;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.primefaces.event.ToggleEvent;
import org.primefaces.model.DualListModel;

import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.primefaces.model.DefaultStreamedContent;

/**
 *
 * @author joao
 */
@ManagedBean(name = "exportarBean")
@ViewScoped
public class ExportarBean implements Serializable {

    private static final long serialVersionUID = -6386492546802452347L;
    private ExportarEao exportarEAO;
    private PropostaEao propostaEAO;
    private EmpreendimentoLoteEao empreendimentoLoteEAO;
    private PropostaValorPercEao propostaValorPercEAO;

    private Proposta selectedProposta;
    private ExportarExcel selectedExportarExcel;
    private Empreendimento empreendimentoSel;

    private List<Proposta> propostaList;
    private List<ExportarExcel> exportarList;
    private List<EmpreendimentoLote> empreendimentoLoteList;

    private String cFiltro = null;
    private FacesMessage msg;
    private HttpSession session;
    private FacesContext ctx;
    private RequestContext context;
    private Usuario usuario;
    private DualListModel<Empresa> empresaPicks;
    private EmpresaEao EmpresaJpa;
    private Funcoes funcoes;

    private boolean empresa;
    private boolean razsoc;
    private boolean fantasia;
    private boolean cnpjcliente;
    private boolean empreendimento;
    private boolean cnpjempreendimento;
    private boolean assunto;
    private boolean numprocesso;
    private boolean orgao;
    private boolean statusprocesso;
    private boolean dscproposta;
    private boolean numos;
    private boolean statusproposta;
    private boolean todos;
    private boolean todosos;

    private boolean etapa;
    private boolean assuntoos;
    private boolean vlretapa;
    private boolean percpagto;
    private boolean evento;
    private boolean nf;
    private boolean datemiss;
    private boolean datvcto;
    private boolean vlrbruto;
    private boolean vlrjuros;
    private boolean vlrmulta;
    private boolean vlrreceb;
    private boolean vlrterc;
    private boolean datpagto;
    private boolean statusetapa;
    private boolean totalos;
    private boolean totalgeral;

    private boolean fechafiltro;
    private boolean abregrid;

    private List<String> selectedCliente;
    private List<String> selectedEmpreendimento;
    private List<String> selectedOs;
    private List<String> selectedEtapa;
    private List<String> selectedProcesso;

    private Date datinicvenc;
    private Date datfimvenc;
    private Date datinicpgto;
    private Date datfimpgto;
    private Date datinicemiss;
    private Date datfimemiss;
    private Date datinicemissetapa;
    private Date datfimemissetapa;
    private Integer progress;

    private boolean botaogerar;
    private boolean botaoexportar;

    private DefaultStreamedContent exportFile;

    //private PropostaValor selectedPropostaValor = new PropostaValor();
    //private PropostaValorPerc selectedPropostaValorPerc = new PropostaValorPerc();
    @PostConstruct
    public void init() {
        propostaEAO = PropostaEao.getInstance();
        exportarEAO = ExportarEao.getInstance();
        EmpresaJpa = EmpresaEao.getInstance();
        empreendimentoLoteEAO = EmpreendimentoLoteEao.getInstance();
        propostaValorPercEAO = PropostaValorPercEao.getInstance();

        selectedProposta = new Proposta();
        selectedExportarExcel = new ExportarExcel();

        try {
            ctx = FacesContext.getCurrentInstance();

            session = (HttpSession) ctx.getExternalContext().getSession(false);
            usuario = (Usuario) session.getAttribute("usuarioAutenticado");
            exportarEAO.executeUpdate("delete from relatorio_financeiro where id_usuario = ".concat(usuario.getIdUsuario().toString()));
            this.exportarList = new ArrayList<>();

            funcoes = new Funcoes();

            // PickList Empresa
            List<Empresa> sourceEmpresa = new ArrayList<>();
            List<Empresa> targetEmpresa = new ArrayList<>();

            sourceEmpresa = EmpresaJpa.getNative("Empresa", 0, EmpresaJpa.getCount("Empresa"), null, true, null, null, null);

            empresaPicks = new DualListModel<>(sourceEmpresa, targetEmpresa);

            empresa = true;
            razsoc = true;
            fantasia = true;
            cnpjcliente = false;
            empreendimento = true;
            cnpjempreendimento = false;
            assunto = false;
            numprocesso = false;
            orgao = false;
            statusprocesso = false;
            dscproposta = true;
            numos = true;
            totalgeral = false;
            etapa = true;
            assuntoos = true;
            vlretapa = false;
            percpagto = true;
            evento = true;
            nf = true;
            datemiss = true;
            datvcto = true;
            vlrbruto = true;
            vlrjuros = true;
            vlrmulta = true;
            vlrreceb = true;
            vlrterc = true;
            datpagto = true;
            statusetapa = true;
            statusproposta = false;
            totalos = false;
            todos = false;
            todosos = false;

            botaogerar = true;
            botaoexportar = false;

            selectedCliente = new ArrayList<>();
            selectedCliente.add("A");
            selectedEmpreendimento = new ArrayList<>();
            selectedEmpreendimento.add("A");
            selectedProcesso = new ArrayList<>();
            //selectedProcesso.add("A");
        } catch (EaoException ex) {
            Logger.getLogger(ExportarBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Proposta getSelectedProposta() {
        return selectedProposta;
    }

    public void setSelectedProposta(Proposta selectedProposta) {
        this.selectedProposta = selectedProposta;
    }

    public List<ExportarExcel> getExportarList() {
        return exportarList;
    }

    public void setExportarList(List<ExportarExcel> exportarList) {
        this.exportarList = exportarList;
    }

    public boolean isEmpresa() {
        return empresa;
    }

    public void setEmpresa(boolean empresa) {
        this.empresa = empresa;
    }

    public boolean isRazsoc() {
        return razsoc;
    }

    public void setRazsoc(boolean razsoc) {
        this.razsoc = razsoc;
    }

    public boolean isFantasia() {
        return fantasia;
    }

    public void setFantasia(boolean fantasia) {
        this.fantasia = fantasia;
    }

    public boolean isCnpjcliente() {
        return cnpjcliente;
    }

    public void setCnpjcliente(boolean cnpjcliente) {
        this.cnpjcliente = cnpjcliente;
    }

    public boolean isEmpreendimento() {
        return empreendimento;
    }

    public void setEmpreendimento(boolean empreendimento) {
        this.empreendimento = empreendimento;
    }

    public boolean isCnpjempreendimento() {
        return cnpjempreendimento;
    }

    public void setCnpjempreendimento(boolean cnpjempreendimento) {
        this.cnpjempreendimento = cnpjempreendimento;
    }

    public boolean isAssunto() {
        return assunto;
    }

    public void setAssunto(boolean assunto) {
        this.assunto = assunto;
    }

    public boolean isNumprocesso() {
        return numprocesso;
    }

    public void setNumprocesso(boolean numprocesso) {
        this.numprocesso = numprocesso;
    }

    public boolean isOrgao() {
        return orgao;
    }

    public void setOrgao(boolean orgao) {
        this.orgao = orgao;
    }

    public boolean isDscproposta() {
        return dscproposta;
    }

    public void setDscproposta(boolean dscproposta) {
        this.dscproposta = dscproposta;
    }

    public boolean isNumos() {
        return numos;
    }

    public void setNumos(boolean numos) {
        this.numos = numos;
    }

    public boolean isTodos() {
        return todos;
    }

    public void setTodos(boolean todos) {
        this.todos = todos;
    }

    public boolean isTodosos() {
        return todosos;
    }

    public void setTodosos(boolean todosos) {
        this.todosos = todosos;
    }

    public boolean isEtapa() {
        return etapa;
    }

    public void setEtapa(boolean etapa) {
        this.etapa = etapa;
    }

    public boolean isAssuntoos() {
        return assuntoos;
    }

    public void setAssuntoos(boolean assuntoos) {
        this.assuntoos = assuntoos;
    }

    public boolean isVlretapa() {
        return vlretapa;
    }

    public void setVlretapa(boolean vlretapa) {
        this.vlretapa = vlretapa;
    }

    public boolean isPercpagto() {
        return percpagto;
    }

    public void setPercpagto(boolean percpagto) {
        this.percpagto = percpagto;
    }

    public boolean isEvento() {
        return evento;
    }

    public void setEvento(boolean evento) {
        this.evento = evento;
    }

    public boolean isNf() {
        return nf;
    }

    public void setNf(boolean nf) {
        this.nf = nf;
    }

    public boolean isDatemiss() {
        return datemiss;
    }

    public void setDatemiss(boolean datemiss) {
        this.datemiss = datemiss;
    }

    public boolean isDatvcto() {
        return datvcto;
    }

    public void setDatvcto(boolean datvcto) {
        this.datvcto = datvcto;
    }

    public boolean isVlrbruto() {
        return vlrbruto;
    }

    public void setVlrbruto(boolean vlrbruto) {
        this.vlrbruto = vlrbruto;
    }

    public boolean isVlrreceb() {
        return vlrreceb;
    }

    public void setVlrreceb(boolean vlrreceb) {
        this.vlrreceb = vlrreceb;
    }

    public boolean isVlrterc() {
        return vlrterc;
    }

    public void setVlrterc(boolean vlrterc) {
        this.vlrterc = vlrterc;
    }

    public boolean isDatpagto() {
        return datpagto;
    }

    public void setDatpagto(boolean datpagto) {
        this.datpagto = datpagto;
    }

    public boolean isStatusetapa() {
        return statusetapa;
    }

    public void setStatusetapa(boolean statusetapa) {
        this.statusetapa = statusetapa;
    }

    public boolean isStatusproposta() {
        return statusproposta;
    }

    public void setStatusproposta(boolean statusproposta) {
        this.statusproposta = statusproposta;
    }

    public boolean isTotalos() {
        return totalos;
    }

    public void setTotalos(boolean totalos) {
        this.totalos = totalos;
    }

    public void atualizaCampos() {
        context = RequestContext.getCurrentInstance();

        context.update("frmExportar:panel");
        context.update("frmExportar:tabExportar");
    }

    public boolean isTotalgeral() {
        return totalgeral;
    }

    public void setTotalgeral(boolean totalgeral) {
        this.totalgeral = totalgeral;
    }

    public boolean isFechafiltro() {
        return fechafiltro;
    }

    public void setFechafiltro(boolean fechafiltro) {
        this.fechafiltro = fechafiltro;
    }

    public List<String> getSelectedEmpreendimento() {
        return selectedEmpreendimento;
    }

    public void setSelectedEmpreendimento(List<String> selectedEmpreendimento) {
        this.selectedEmpreendimento = selectedEmpreendimento;
    }

    public List<String> getSelectedOs() {
        return selectedOs;
    }

    public void setSelectedOs(List<String> selectedOs) {
        this.selectedOs = selectedOs;
    }

    public List<String> getSelectedEtapa() {
        return selectedEtapa;
    }

    public void setSelectedEtapa(List<String> selectedEtapa) {
        this.selectedEtapa = selectedEtapa;
    }

    public List<String> getSelectedCliente() {
        return selectedCliente;
    }

    public void setSelectedCliente(List<String> selectedCliente) {
        this.selectedCliente = selectedCliente;
    }

    public Date getDatinicvenc() {
        return datinicvenc;
    }

    public void setDatinicvenc(Date datinicvenc) {
        this.datinicvenc = datinicvenc;
    }

    public Date getDatfimvenc() {
        return datfimvenc;
    }

    public void setDatfimvenc(Date datfimvenc) {
        this.datfimvenc = datfimvenc;
    }

    public Date getDatinicpgto() {
        return datinicpgto;
    }

    public void setDatinicpgto(Date datinicpgto) {
        this.datinicpgto = datinicpgto;
    }

    public Date getDatfimpgto() {
        return datfimpgto;
    }

    public void setDatfimpgto(Date datfimpgto) {
        this.datfimpgto = datfimpgto;
    }

    public Date getDatinicemiss() {
        return datinicemiss;
    }

    public void setDatinicemiss(Date datinicemiss) {
        this.datinicemiss = datinicemiss;
    }

    public Date getDatfimemiss() {
        return datfimemiss;
    }

    public void setDatfimemiss(Date datfimemiss) {
        this.datfimemiss = datfimemiss;
    }

    public Date getDatinicemissetapa() {
        return datinicemissetapa;
    }

    public void setDatinicemissetapa(Date datinicemissetapa) {
        this.datinicemissetapa = datinicemissetapa;
    }

    public Date getDatfimemissetapa() {
        return datfimemissetapa;
    }

    public void setDatfimemissetapa(Date datfimemissetapa) {
        this.datfimemissetapa = datfimemissetapa;
    }

    public boolean isAbregrid() {
        return abregrid;
    }

    public void setAbregrid(boolean abregrid) {
        this.abregrid = abregrid;
    }

    public DualListModel<Empresa> getEmpresaPicks() {
        return empresaPicks;
    }

    public void setEmpresaPicks(DualListModel<Empresa> empresaPicks) {
        this.empresaPicks = empresaPicks;
    }

    public void onToggle(ToggleEvent event) {
        int nOrdinal = event.getVisibility().ordinal();
        if (nOrdinal == 0) {
            this.abregrid = false;
            this.botaoexportar = false;
            this.botaogerar = true;
        } else {
            this.abregrid = true;
            this.botaoexportar = true;
            this.botaogerar = false;
        }
    }

    public List<String> getSelectedProcesso() {
        return selectedProcesso;
    }

    public void setSelectedProcesso(List<String> selectedProcesso) {
        this.selectedProcesso = selectedProcesso;
    }

    public void atualizaTodos() {
        context = RequestContext.getCurrentInstance();

        empresa = this.todos;
        razsoc = this.todos;
        fantasia = this.todos;
        cnpjcliente = this.todos;
        empreendimento = this.todos;
        cnpjempreendimento = this.todos;
        assunto = this.todos;
        numprocesso = this.todos;
        orgao = this.todos;
        statusprocesso = this.todos;
        dscproposta = this.todos;
        numos = this.todos;
        statusproposta = this.todos;
        totalgeral = this.todos;

        context.update("frmExportar:panel");
        context.update("frmExportar:tabExportar");
    }

    public void atualizaTodosOs() {
        context = RequestContext.getCurrentInstance();

        etapa = this.todosos;
        assuntoos = this.todosos;
        vlretapa = this.todosos;
        percpagto = this.todosos;
        evento = this.todosos;
        nf = this.todosos;
        datemiss = this.todosos;
        datvcto = this.todosos;
        vlrbruto = this.todosos;
        vlrjuros = this.todosos;
        vlrmulta = this.todosos;
        vlrreceb = this.todosos;
        vlrterc = this.todosos;
        datpagto = this.todosos;
        statusetapa = this.todosos;
        totalos = this.todosos;

        context.update("frmExportar:panel");
        context.update("frmExportar:tabExportar");
    }

    public void geraDados(ActionEvent actionEvent) {
        msg = null;
        boolean lPassa = true;
        context = RequestContext.getCurrentInstance();

        try {
            cFiltro = "";

            // FILTRA OS CLIENTES
            if (selectedCliente.isEmpty()) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar um Status do Cliente!", " ");
            } else {
                cFiltro += " cliente.sta_cliente in (";
                for (String selectedCliente1 : selectedCliente) {
                    cFiltro += "'".concat(selectedCliente1).concat("',");
                }
                cFiltro += "'X') ";
            }

            if (lPassa) {
                // FILTRA OS EMPREENDIMENTOS
                if (selectedEmpreendimento.isEmpty()) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar um Status do Empreendimento!", " ");
                } else {
                    cFiltro += " and empreendimento.sta_empreendimento in (";
                    for (String selectedEmpreendimento1 : selectedEmpreendimento) {
                        cFiltro += "'".concat(selectedEmpreendimento1).concat("',");
                    }
                    cFiltro += "'X') ";
                }
            }

            String cFiltroProcesso = "";
            if (lPassa) {
                // VERIFICA OS STATUS PROCESSOS
                /*
                 if (selectedProcesso.isEmpty()) {
                 lPassa = false;
                 msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar um Status do Processo!", " ");
                 } else {
                 */
                if (!this.selectedProcesso.isEmpty()) {
                    cFiltroProcesso = " status in (";
                    for (String selectedProcesso1 : this.selectedProcesso) {
                        cFiltroProcesso += "'".concat(selectedProcesso1.concat("',"));
                    }
                    cFiltroProcesso += "'X') ";
                }
                //}
            }

            if (lPassa) {
                // FILTRA OS ORDEM DE SERVICO
                if (selectedOs.isEmpty()) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar um Status da Ordem de Serviço!", " ");
                } else {
                    cFiltro += " and proposta.tip_status in (";

                    for (String selectedStatus1 : selectedOs) {
                        switch (selectedStatus1) {
                            case "8":
                                cFiltro += "'8',";
                                break;
                            case "0":
                                cFiltro += "'0',";
                                break;
                            case "A":
                                cFiltro += "'A',";
                                break;
                        }
                    }
                    cFiltro += "'X') ";
                }
            }

            String cFiltroPerc = "";
            if (lPassa) {
                // VERIFICA OS STATUS ETAPAS
                if (selectedEtapa.isEmpty()) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar um Status da Etapa!", " ");
                } else {
                    cFiltroPerc = " proposta_valor_perc.ord_status in (";
                    for (String selectedEtapa1 : selectedEtapa) {
                        cFiltroPerc += "'".concat(selectedEtapa1).concat("',");
                    }
                    cFiltroPerc += "'X') ";
                }
            }

            if (lPassa) {
                // FILTRA AS EMPRESAS
                if (empresaPicks.getTarget().isEmpty()) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar Empresa!", " ");
                } else {
                    cFiltro += " and empresa.id_empresa in (";
                    for (Empresa target : empresaPicks.getTarget()) {
                        cFiltro += target.getIdEmpresa() + ",";
                    }
                    cFiltro += "0) ";
                }
            }

            //  VERIFICA DATA EMISSAO O.S.
            if (lPassa) {
                if (this.datinicemiss != null && this.datfimemiss != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimemiss, this.datinicemiss)) {
                        lPassa = true;
                        cFiltro += " and proposta.dat_os BETWEEN '".concat(funcoes.ConverteDateString(this.datinicemiss)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimemiss)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão O.S. Incorreta!", "");
                    }
                } else if ((this.datinicemiss == null && this.datfimemiss != null) || (this.datinicemiss != null && this.datfimemiss == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão O.S. Incorreta!", "");
                }
            }

            // VERIFICA  DATA EMISSAO ETAPA
            if (lPassa) {
                if (this.datinicemissetapa != null && this.datfimemissetapa != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimemissetapa, this.datinicemissetapa)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPerc += " proposta_valor_perc.dat_emissao BETWEEN '".concat(funcoes.ConverteDateString(this.datinicemissetapa)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimemissetapa)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão Etapa Incorreta!", "");
                    }
                } else if ((this.datinicemissetapa == null && this.datfimemissetapa != null) || (this.datinicemissetapa != null && this.datfimemissetapa == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão Etapa Incorreta!", "");
                }
            }

            // VERIFICA DATA VENCIMENTO
            if (lPassa) {
                if (this.datinicvenc != null && this.datfimvenc != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimvenc, this.datinicvenc)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPerc += " (proposta_valor_perc.dat_venc_nota BETWEEN '".concat(funcoes.ConverteDateString(this.datinicvenc)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimvenc)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Vencimento Incorreta!", "");
                    }
                } else if ((this.datinicvenc == null && this.datfimvenc != null) || (this.datinicvenc != null && this.datfimvenc == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Vencimento Incorreta!", "");
                }
            }

            // VERIFICA DATA PAGAMENTO
            if (lPassa) {
                if (this.datinicpgto != null && this.datfimpgto != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimpgto, this.datinicpgto)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPerc += " proposta_valor_perc.dat_pagamento BETWEEN '".concat(funcoes.ConverteDateString(this.datinicpgto)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimpgto)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Pagamento Incorreta!", "");
                    }
                } else if ((this.datinicpgto == null && this.datfimpgto != null) || (this.datinicpgto != null && this.datfimpgto == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Pagamento Incorreta!", "");
                }
            }

            // CARREGA OS DADOS DA PROPOSTA
            // Pega os Dados com os filtros
            if (lPassa) {
                this.propostaList = this.propostaEAO.getNative("Proposta", 0, propostaEAO.getCount("Proposta"), null, true, null, null, cFiltro);
                if (this.propostaList.isEmpty()) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nenhum Registro foi Retornado para esses Filtros!", " ");
                } else {
                    // FILTRA OS STATUS PROCESSOS
                    //exportarEAO.executeUpdate("delete from relatorio_financeiro where id_usuario = ".concat(usuario.getIdUsuario().toString()));
                    this.exportarList = new ArrayList<>();

                    if (!cFiltroProcesso.isEmpty()) {
                        cFiltroProcesso += " and ";
                    }

                    if (!cFiltroPerc.isEmpty()) {
                        cFiltroPerc += " and ";
                    }

                    for (Proposta propostaList1 : this.propostaList) {
                        this.selectedProposta = propostaList1;
                        this.empreendimentoSel = new Empreendimento();
                        this.selectedExportarExcel = new ExportarExcel();

                        this.empreendimentoSel = this.selectedProposta.getIdEmpreendimento();

                        // PEGA OS PROCESSOS
                        if (!cFiltroProcesso.isEmpty()) {
                            cFiltro = cFiltroProcesso.concat(" id_empreendimento = ".concat(this.empreendimentoSel.getIdEmpreendimento().toString())).concat(" ");
                            this.empreendimentoLoteList = this.empreendimentoLoteEAO.getNative("EmpreendimentoLote", 0, this.empreendimentoLoteEAO.getCount("EmpreendimentoLote"), null, true, null, null, cFiltro);
                        } else {
                            this.empreendimentoLoteList = new ArrayList<>();
                        }
                        this.empreendimentoSel.setEmpreendimentoLoteList(empreendimentoLoteList);

                        // PEGA EMPRESA // PROPOSTA // EMPREENDIMENTO // PROCESSOS
                        this.selectedExportarExcel.setDscEmpresa(this.selectedProposta.getIdEmpresa().getNomEmpresa());
                        this.selectedProposta.setIdEmpreendimento(this.empreendimentoSel);
                        this.selectedExportarExcel.setIdProposta(this.selectedProposta);
                        this.selectedExportarExcel.setIdUsuario(this.usuario);

                        // PEGA AS ETAPAS
                        if (this.selectedProposta.getPropostaValorList().isEmpty()) {
                            this.exportarList.add(selectedExportarExcel);
                        } else {
                            for (PropostaValor propostaValorList2 : this.selectedProposta.getPropostaValorList()) {
                                cFiltro = cFiltroPerc.concat(" proposta_valor_perc.id_proposta_valor = ".concat(propostaValorList2.getIdPropostaValor().toString())).concat(" ");
                                List<PropostaValorPerc> propostaValorPercList = this.propostaValorPercEAO.getNative("PropostaValorPerc", 0, this.propostaValorPercEAO.getCount("PropostaValorPerc"), null, true, null, null, cFiltro);

                                if (!propostaValorPercList.isEmpty()) {
                                    for (PropostaValorPerc propostaValorPerc : propostaValorPercList) {
                                        this.selectedExportarExcel = new ExportarExcel();
                                        this.selectedExportarExcel.setDscEmpresa(this.selectedProposta.getIdEmpresa().getNomEmpresa());
                                        this.selectedProposta.setIdEmpreendimento(this.empreendimentoSel);
                                        this.selectedExportarExcel.setIdProposta(this.selectedProposta);
                                        this.selectedExportarExcel.setIdUsuario(this.usuario);
                                        this.selectedExportarExcel.setDscEtapa(propostaValorPerc.getIdPropostaValor().getDscEtapa());
                                        this.selectedExportarExcel.setDscAssunto(propostaValorPerc.getIdPropostaValor().getDscAssunto());
                                        this.selectedExportarExcel.setVlrEtapa(propostaValorPerc.getIdPropostaValor().getVlrEtapa());
                                        this.selectedExportarExcel.setDatEmissao(propostaValorPerc.getDatEmissao());
                                        this.selectedExportarExcel.setDatPagamento(propostaValorPerc.getDatPagamento());
                                        this.selectedExportarExcel.setDatVencNota(propostaValorPerc.getDatVencNota());
                                        this.selectedExportarExcel.setDscNfe(propostaValorPerc.getDscNfe());
                                        this.selectedExportarExcel.setDscPerc(propostaValorPerc.getDscPerc());
                                        this.selectedExportarExcel.setNumOrdem(propostaValorPerc.getNumOrdem());
                                        this.selectedExportarExcel.setOrdStatus(propostaValorPerc.getOrdStatus());
                                        this.selectedExportarExcel.setPercEtapa(propostaValorPerc.getPercEtapa());
                                        this.selectedExportarExcel.setVlrCustoIss(propostaValorPerc.getVlrCustoIss());
                                        this.selectedExportarExcel.setVlrImposto(propostaValorPerc.getVlrImposto());
                                        this.selectedExportarExcel.setVlrJuros(propostaValorPerc.getVlrJuros());
                                        this.selectedExportarExcel.setVlrLiquido(propostaValorPerc.getVlrLiquido());
                                        this.selectedExportarExcel.setVlrMulta(propostaValorPerc.getVlrMulta());
                                        this.selectedExportarExcel.setVlrPago(propostaValorPerc.getVlrPago());
                                        this.selectedExportarExcel.setVlrProposta(propostaValorPerc.getVlrProposta());
                                        this.selectedExportarExcel.setDscOrdStatus(propostaValorPerc.getDscOrdStatus());
                                        this.exportarList.add(selectedExportarExcel);
                                    }
                                } /*else {
                                 this.selectedExportarExcel.setDscEtapa(propostaValorList2.getDscEtapa());
                                 this.selectedExportarExcel.setDscAssunto(propostaValorList2.getDscAssunto());
                                 this.selectedExportarExcel.setVlrEtapa(propostaValorList2.getVlrEtapa());
                                 this.exportarList.add(selectedExportarExcel);
                                 }*/

                            }
                        }
                    }

                    this.fechafiltro = true;
                    this.abregrid = true;
                    this.botaoexportar = true;
                    this.botaogerar = false;

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração dos Dados efetuada com Sucesso!", " ");
                }
            }
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Gerar os Dados!", " ");
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.update("frmExportar:pnStatus");
            context.update("frmExportar:fsCampos");
            context.update("frmExportar:fsStatus");
            context.update("frmExportar:fsFiltro");
            context.update("frmExportar:tabExportar");
            context.update("frmExportar:panel");

        }
    }

    public void geraPlanilha(ActionEvent actionEvent) {
        context = RequestContext.getCurrentInstance();
        msg = null;
        String cNomeArquivo = "exportar_".concat(usuario.getUsrName()).concat(".xlsx");
        XSSFRow row = null;
        XSSFCell cell = null;
        try {
            List<String> columnNames = new ArrayList<>();

            if (this.empresa) {
                columnNames.add("EMPRESA");
            }
            if (this.numos) {
                columnNames.add("NUMERO O.S.");
            }
            if (this.numprocesso) {
                columnNames.add("NUMERO PROCESSO");
            }
            if (this.orgao) {
                columnNames.add("ORGÃO");
            }
            if (this.assunto) {
                columnNames.add("ASSUNTO");
            }
            if (this.statusprocesso) {
                columnNames.add("SITUAÇÃO PROCESSO");
            }
            if (this.razsoc) {
                columnNames.add("RAZÃO SOCIAL");
            }
            if (this.fantasia) {
                columnNames.add("NOME FANTASIA");
            }
            if (this.cnpjcliente) {
                columnNames.add("C.N.P.J./C.P.F. CLIENTE");
            }
            if (this.empreendimento) {
                columnNames.add("EMPREENDIMENTO");
            }
            if (this.cnpjempreendimento) {
                columnNames.add("C.N.P.J./C.P.F. EMPREENDIMENTO");
            }
            if (this.dscproposta) {
                columnNames.add("DESCRIÇÃO PROPOSTA");
            }
            if (this.statusproposta) {
                columnNames.add("STATUS PROPOSTA");
            }
            if (this.etapa) {
                columnNames.add("ETAPA");
            }
            if (this.assuntoos) {
                columnNames.add("ASSUNTO");
            }
            if (this.vlretapa) {
                columnNames.add("VALOR ETAPA");
            }
            if (this.percpagto) {
                columnNames.add("% PAGTO.");
            }
            if (this.evento) {
                columnNames.add("EVENTO");
            }
            if (this.nf) {
                columnNames.add("NOTA FISCAL");
            }
            if (this.datemiss) {
                columnNames.add("DATA EMISSÃO");
            }
            if (this.datvcto) {
                columnNames.add("DATA VENCIMENTO");
            }
            if (this.datpagto) {
                columnNames.add("DATA PAGAMENTO");
            }
            if (this.vlrbruto) {
                columnNames.add("VALOR BRUTO");
            }
            if (this.vlrjuros) {
                columnNames.add("VALOR JUROS");
            }
            if (this.vlrmulta) {
                columnNames.add("VALOR MULTA");
            }
            if (this.vlrreceb) {
                columnNames.add("VALOR RECEBIDO");
            }
            if (this.vlrterc) {
                columnNames.add("VALOR TERCEIRO");
            }
            if (this.statusetapa) {
                columnNames.add("STATUS ETAPA");
            }

            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFCellStyle styleHeader = (XSSFCellStyle) wb.createCellStyle();
            XSSFFont fontHeader = (XSSFFont) wb.createFont();
            fontHeader.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
            styleHeader.setFont(fontHeader);
            XSSFSheet sheet1 = (XSSFSheet) wb.createSheet("Planilha");

            row = sheet1.createRow(0);

            for (int i = 0; i < columnNames.size(); i++) {
                sheet1.setColumnWidth(i, 256 * 15);
                cell = row.createCell(i);
                cell.setCellValue(columnNames.get(i));
                cell.setCellStyle(styleHeader);
            }

            // VOLTA FONTE AO NORMAL
            XSSFCellStyle styleLinha = (XSSFCellStyle) wb.createCellStyle();
            XSSFFont fontHeaderLinha = (XSSFFont) wb.createFont();
            fontHeaderLinha.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
            styleLinha.setFont(fontHeaderLinha);

            int j;
            // LINHA PRINCIPAL
            int r = 1;
            boolean lPassaProcesso = true;
            boolean lPassaOs = true;
            String cNumeroProcessoTemp = "";
            String cOrgaoTemp = "";
            String cAssuntoTemp = "";
            String cSituacaoProcessoTemp = "";

            row = sheet1.createRow(r);

            for (ExportarExcel exportarList1 : this.exportarList) {

                this.selectedProposta = exportarList1.getIdProposta();

                // COLUNA PRINCIPAL
                j = 0;

                if (this.empresa) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getIdEmpresa().getNomEmpresa());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.numos) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getNumOs());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                // PROCESSOS INICIO
                cNumeroProcessoTemp = "";
                cOrgaoTemp = "";
                cAssuntoTemp = "";
                cSituacaoProcessoTemp = "";
                for (int i = 0; i < this.selectedProposta.getIdEmpreendimento().getEmpreendimentoLoteList().size(); i++) {
                    if (this.numprocesso) {
                        cNumeroProcessoTemp += "//".concat(this.selectedProposta.getIdEmpreendimento().getEmpreendimentoLoteList().get(i).getNumProcesso());
                    }
                    if (this.orgao) {
                        cOrgaoTemp += "//".concat(this.selectedProposta.getIdEmpreendimento().getEmpreendimentoLoteList().get(i).getDscOrgao());
                    }
                    if (this.assunto) {
                        cAssuntoTemp += "//".concat(this.selectedProposta.getIdEmpreendimento().getEmpreendimentoLoteList().get(i).getIdAssunto().getDscAssunto());
                    }
                    if (this.statusprocesso) {
                        cSituacaoProcessoTemp += "//".concat(this.selectedProposta.getIdEmpreendimento().getEmpreendimentoLoteList().get(i).getDscStatus());
                    }
                }
                if (this.numprocesso) {
                    cell = row.createCell(j);
                    cell.setCellValue(cNumeroProcessoTemp);
                    cell.setCellStyle(styleLinha);
                    j++;

                }
                if (this.orgao) {
                    cell = row.createCell(j);
                    cell.setCellValue(cOrgaoTemp);
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.assunto) {
                    cell = row.createCell(j);
                    cell.setCellValue(cAssuntoTemp);
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.statusprocesso) {
                    cell = row.createCell(j);
                    cell.setCellValue(cSituacaoProcessoTemp);
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                // PROCESSOS FIM

                if (this.razsoc) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getIdCliente().getNomCliente());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.fantasia) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getIdCliente().getNomFantasia());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.cnpjcliente) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataCPFCNPF(this.selectedProposta.getIdCliente().getNumCpf(), this.selectedProposta.getIdCliente().getTipCliente()));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.empreendimento) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getIdEmpreendimento().getDscEmpreendimento());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.cnpjempreendimento) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getIdEmpreendimento().getNumCpfEmpreendimento());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.dscproposta) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getDscProposta());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.statusproposta) {
                    cell = row.createCell(j);
                    cell.setCellValue(this.selectedProposta.getDscCorStatus());
                    cell.setCellStyle(styleLinha);
                    j++;
                }

                // ORDEM DE SERVICO
                if (this.etapa) {
                    cell = row.createCell(j);
                    cell.setCellValue(exportarList1.getDscEtapa());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.assuntoos) {
                    cell = row.createCell(j);
                    cell.setCellValue(exportarList1.getDscAssunto());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.vlretapa) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrEtapa(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.percpagto) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getPercEtapa(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.evento) {
                    cell = row.createCell(j);
                    cell.setCellValue(exportarList1.getDscPerc());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.nf) {
                    cell = row.createCell(j);
                    cell.setCellValue(exportarList1.getDscNfe());
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.datemiss) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.ConverteDateString(exportarList1.getDatEmissao()));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.datvcto) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.ConverteDateString(exportarList1.getDatVencNota()));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.datpagto) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.ConverteDateString(exportarList1.getDatPagamento()));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.vlrbruto) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrProposta(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.vlrjuros) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrJuros(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.vlrmulta) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrMulta(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }
                if (this.vlrreceb) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrPago(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }

                if (this.vlrterc) {
                    cell = row.createCell(j);
                    cell.setCellValue(funcoes.FormataValor(exportarList1.getVlrLiquido(), 2));
                    cell.setCellStyle(styleLinha);
                    j++;
                }

                if (this.statusetapa) {
                    cell = row.createCell(j);
                    cell.setCellValue(exportarList1.getDscOrdStatus());
                    cell.setCellStyle(styleLinha);
                    j++;
                }

                row = sheet1.createRow(r++);
            }

            FileOutputStream streamOut = new FileOutputStream(cNomeArquivo);
            wb.write(streamOut);
            streamOut.flush();
            streamOut.close();

            InputStream stream = new BufferedInputStream(new FileInputStream(cNomeArquivo));
            exportFile = new DefaultStreamedContent(stream, "application/xls", cNomeArquivo);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Criação da Planilha efetuada com Sucesso!", " ");
        } catch (Exception ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Gerar a Planilha!", " ");
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);

            context.update("frmExportar:pnStatus");
            context.update("frmExportar:fsCampos");
            context.update("frmExportar:fsStatus");
            context.update("frmExportar:fsFiltro");
            context.update("frmExportar:tabExportar");
            context.update("frmExportar:panel");
        }
    }

    public DefaultStreamedContent getExportFile() {
        return exportFile;
    }

    public void setExportFile(DefaultStreamedContent exportFile) {
        this.exportFile = exportFile;
    }

    public void onComplete() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Progresso Completado", "Carga Completa"));
    }

    public Integer getProgress() {
        if (progress == null) {
            progress = 0;
        }
        return progress;
    }

    public void setProgress(Integer progress) {
        this.progress = progress;
    }

    public boolean isBotaogerar() {
        return botaogerar;
    }

    public void setBotaogerar(boolean botaogerar) {
        this.botaogerar = botaogerar;
    }

    public boolean isBotaoexportar() {
        return botaoexportar;
    }

    public void setBotaoexportar(boolean botaoexportar) {
        this.botaoexportar = botaoexportar;
    }

    public boolean isVlrjuros() {
        return vlrjuros;
    }

    public void setVlrjuros(boolean vlrjuros) {
        this.vlrjuros = vlrjuros;
    }

    public boolean isVlrmulta() {
        return vlrmulta;
    }

    public void setVlrmulta(boolean vlrmulta) {
        this.vlrmulta = vlrmulta;
    }

    public boolean isStatusprocesso() {
        return statusprocesso;
    }

    public void setStatusprocesso(boolean statusprocesso) {
        this.statusprocesso = statusprocesso;
    }

}
